package com.peko.controller;

import com.peko.config.MyRestTemplateConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author：Peko
 * @Description：TODO
 * @Date：Created in 11:46 2023/7/31
 */
@RestController
public class UsersController {

    /**
     * Ribbon 是客户端的负载均衡，从服务注册中心拉取服务列表下来进行缓存，然后轮询调用服务。
     * */

    private static final Logger log = LoggerFactory.getLogger("UsersController");

    //服务发现客户端对象，根据服务ID去服务注册中心获取对应服务列表到本地
    @Autowired
    private DiscoveryClient discoveryClient;

    //负载均衡客户端对象，根据服务ID去服务注册中心获取对应服务列表，根据默认负载均衡策略选择列表中的一台机器进行评估返回
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Resource
    private MyRestTemplateConfig restTemplateConfig;

    @GetMapping("users")
    public String users(){

        //使用 DiscoveryClient 返回服务的集群集合
        List<ServiceInstance> ordersServices = discoveryClient.getInstances("ORDERS");
        ordersServices.forEach((order)->{
            log.info("服务主机：{}，服务端口：{}，服务地址：{}",order.getHost(),order.getPort(),order.getUri());
        });

        //使用 LoadBalancerClient
        ServiceInstance orders = loadBalancerClient.choose("ORDERS");
        log.info("服务主机：{}，服务端口：{}，服务地址：{}",orders.getHost(),orders.getPort(),orders.getUri());
        String result = new RestTemplate().getForObject(orders.getUri()+"/orders", String.class);
        log.info(result);

        //使用 @LoadBalanced
        String ordersResult = restTemplateConfig.restTemplate().getForObject("http://ORDERS/orders", String.class);
        log.info(ordersResult);

        return "users";
    }
}
